package com.example.examsystem.repository;

import com.example.examsystem.model.RolePermission;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 角色权限关联仓库接口
 * 用于管理角色和权限之间的多对多关系
 */
@Repository
public interface RolePermissionRepository extends JpaRepository<RolePermission, Long> {
    
    /**
     * 根据角色ID查找角色权限关系
     */
    List<RolePermission> findByRoleId(Long roleId);
    
    /**
     * 根据权限ID查找角色权限关系
     */
    List<RolePermission> findByPermissionId(Long permissionId);
    
    /**
     * 根据角色ID和权限ID查找角色权限关系
     */
    RolePermission findByRoleIdAndPermissionId(Long roleId, Long permissionId);
    
    /**
     * 根据角色ID删除角色权限关系
     */
    @Modifying
    @Transactional
    void deleteByRoleId(Long roleId);
    
    /**
     * 根据权限ID删除角色权限关系
     */
    @Modifying
    @Transactional
    void deleteByPermissionId(Long permissionId);
    
    /**
     * 根据角色ID和权限ID删除角色权限关系
     */
    @Modifying
    @Transactional
    void deleteByRoleIdAndPermissionId(Long roleId, Long permissionId);
    
    /**
     * 检查角色是否拥有指定权限
     */
    boolean existsByRoleIdAndPermissionId(Long roleId, Long permissionId);
    
    /**
     * 根据角色ID查询权限ID列表
     */
    @Query("SELECT rp.permissionId FROM RolePermission rp WHERE rp.roleId = :roleId")
    List<Long> findPermissionIdsByRoleId(@Param("roleId") Long roleId);
    
    /**
     * 根据权限ID查询角色ID列表
     */
    @Query("SELECT rp.roleId FROM RolePermission rp WHERE rp.permissionId = :permissionId")
    List<Long> findRoleIdsByPermissionId(@Param("permissionId") Long permissionId);
    
    /**
     * 根据角色ID列表查询权限ID列表
     */
    @Query("SELECT rp.permissionId FROM RolePermission rp WHERE rp.roleId IN :roleIds")
    List<Long> findPermissionIdsByRoleIds(@Param("roleIds") List<Long> roleIds);
    
    /**
     * 根据权限ID列表查询角色ID列表
     */
    @Query("SELECT rp.roleId FROM RolePermission rp WHERE rp.permissionId IN :permissionIds")
    List<Long> findRoleIdsByPermissionIds(@Param("permissionIds") List<Long> permissionIds);
}


